﻿/*
 * Created by SharpDevelop.
 * User: XPMUser
 * Date: 10/31/2011
 * Time: 5:43 PM
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;

namespace KDG.FoldersSize4
{
	/// <summary>
	/// Description of ScannerItem.
	/// </summary>
	public class ScannerItem
	{
		/// <summary>
        /// Имя файла/папки
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// Общий размер файла/папки (включая поддиректории)
        /// </summary>
        public long Length { get; set; }
        /// <summary>
        /// Полный путь к файлу/папки
        /// </summary>
        public string FullName { get; set; }
        /// <summary>
        /// Флаг: является ли папкой
        /// </summary>
        public bool IsDirectory { get; set; }
        /// <summary>
        /// Список подчиненных объектов
        /// </summary>
        public List<ScannerItem> Childs { get; protected set; }
        /// <summary>
        /// Количество подчиненных директорий (включая все поддиректории поддиректорий)
        /// </summary>
        public int FoldersCount { get; set; }
        /// <summary>
        /// Количество подчиненных файлов (включая все файлы подчиненных поддиректорий)
        /// </summary>
        public int FilesCount { get; set; }
        /// <summary>
        /// Процентное отношение размера объекта к общему размеру всех объектов родителя
        /// </summary>
        public double Progress { get; protected set; }
        /// <summary>
        /// Процентное отношение размера объекта к общему размеру
        /// </summary>
        public double ProgressTotal { get; protected set; }

        public ScannerItem() { this.Childs = new List<ScannerItem>(); IsDirectory = true; }
        /// <summary>
        /// Класс для хранения информации об объектах диска (директорий и файлов).
        /// </summary>
        /// <param name="Name">Имя объекта</param>
        /// <param name="FullName">Полный путь к объекту</param>
        public ScannerItem(string Name, string FullName) : this() { this.Name = Name; this.FullName = FullName; }

        /// <summary>
        /// Сортирует подчиненные объекты по убыванию размера
        /// </summary>
        internal void SortChilds()
        {
            Childs.Sort((x, y) =>
                                {
                                    if (x.Length == y.Length)
                                        return 0;
                                    if (x.Length > y.Length)
                                        return -1;
                                    else
                                        return 1;
                                }
            );
        }
        /// <summary>
        /// Подсчитивает отношение размера объекта к общему размеру всех подчиненных объектов
        /// </summary>
        internal void CalcPprogress()
        {
            Childs.ForEach(x => x.Progress = ((double)x.Length) / ((double)Length) * 100.0f);
        }



        internal void CalcPprogressTotal(long TotalLength)
        {
            Childs.ForEach(x =>
                {
                    x.ProgressTotal = ((double)x.Length) / ((double)TotalLength) * 100.0f;
                    x.CalcPprogressTotal(TotalLength);
                }
            );
        }

        public ScannerItem Clone()
        {
            ScannerItem c = new ScannerItem()
            {
                Name = this.Name,
                Length = this.Length,
                FullName = this.FullName,
                IsDirectory = this.IsDirectory,
                FoldersCount = this.FoldersCount,
                FilesCount = this.FilesCount,
                Progress = this.Progress,
                ProgressTotal = this.ProgressTotal,
            };

            this.Childs.ForEach(x => c.Childs.Add(x.Clone()));

            return c;
        }
        
        public override string ToString()
		{
			return 
				string.Format("ScannerItem:Is directory ({0}), [{1}]", this.IsDirectory, this.FullName);
		}

	}
}
